#include <iostream>
#include "student.h"

class Student
{
public:
    Student(){}
    Student(int id, const std::string &name) : id(id), name(name)
    {
        count++;
    }
    void show()
    {
        std::cout << id << " " << name << std::endl;
    }
    ~Student(){}

    void print() // 静态函数也能被继承
    {
        // count++;
        std::cout<<"hello"<<std::endl;
    }
private:
    int id;
    std::string name;
public:
    static int count;
};

int Student::count = 0;   // 类外初始化

class PrimaryStudent : public Student
{
public:
    // void MyShow()
    // {
    //     show(); // 可以访问
    //     id;     // 不可访问 Student类里改protected
    // }
    // PrimaryStudent() : score(0) // 父类有无参构造时 ，可以不在初始化列表中调父类无参
    // {
    //     std::cout << "子类无参构造\n";
    // }
    PrimaryStudent():Student(0,""),score(0){} // 父类无无参构造时,调有参初始为0 不可不调，会报错
    PrimaryStudent(int id, const std::string &name, int score) : Student(id, name), score(score){} // 在子类的初始化列表中调用父类的构造函数
    ~PrimaryStudent(){}

    // 名词遮蔽 ：父类函数和子类函数同名(不能重载，只要同名，就被遮蔽)，子类无法调用父类同类函数
    void show()
    {
       Student::show();  // 通过明确函数的域，来调用父类函数
       std::cout<<score<<std::endl;
    }
private:
    int score; // 新定义的自己的属性
public:
    static int count;   // 父类的静态变量被遮蔽
};   

int PrimaryStudent::count = 0;

int main()
{
    Student s(1,"lisi");
    s.print();
    std::cout<<s.count<<std::endl;
    PrimaryStudent s1(1,"zhangsan",100);
    s.print();
    std::cout<<s.count<<std::endl;
    std::cout<<s1.count<<std::endl;  
    return 0;
}

// 父类成员的构造方式：在子类的初始化列表中调用父类的构造函数


